﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Common;
using System.Collections;
using System.Transactions;
using Caixa.DB;
using Caixa.Model;
using Caixa.Model.Enum;
using Caixa.Model.Interface;

namespace Caixa.DAO
{
	public class PessoaJuridicaDAO : PessoaDAO<PessoaJuridica>
	{
		#region " Methods "

		#region " Get Methods "

		public new static PessoaJuridica GetByID(int id)
		{
			PessoaJuridica p = null;

			// Carrega os dados de pessoa				
			IPessoa pessoa = PessoaDAO<PessoaJuridica>.GetByID(id);
			if (pessoa != null)
				p = (pessoa as PessoaJuridica);

			using (DAHelper db = new DAHelper())
			{
				string SQL = string.Format(@"
					SELECT 
						{1}, {2}
					FROM {0}					
					WHERE
						{1} = :{1}
				",
					PessoaJuridica.Fields.TABELA,
					PessoaJuridica.Fields.ID,
					PessoaJuridica.Fields.CNPJ
				);

				// Prepara os parâmetros da Query
				List<DbParameter> parms = new List<DbParameter>();
				parms.Add(db.GetParameter(PessoaJuridica.Fields.ID, id));

				// Executa a query no Conta de dados
				IEnumerator data = db.SelectSqlDr(SQL, parms.ToArray()).GetEnumerator();

				// Converte o resultado do banco de dados em objeto
				p = DAHelper.ToModel<PessoaJuridica>(data, p);
			}

			return p;
		}

		public new static bool Existe(int id)
		{
			return (GetByID(id) != null);
		}

		public static PessoaJuridica GetByCNPJ(string cnpj)
		{
			PessoaJuridica p = null;

			using (DAHelper db = new DAHelper())
			{
				string SQL = string.Format(@"
					SELECT 
						{1}
					FROM {0}					
					WHERE
						{2} = :{2}
				",
					PessoaJuridica.Fields.TABELA,
					PessoaJuridica.Fields.ID,
					PessoaJuridica.Fields.CNPJ
				);

				// Prepara os parâmetros da Query
				List<DbParameter> parms = new List<DbParameter>();
				parms.Add(db.GetParameter(PessoaJuridica.Fields.CNPJ, cnpj));

				// Executa a query no Conta de dados
				int pessoaJuridicaID;
				int.TryParse(string.Format("{0}", db.SelectSqlSc(SQL, parms.ToArray())), out pessoaJuridicaID);

				p = GetByID(pessoaJuridicaID);
			}

			return p;
		}

		#endregion

		#region " Management Methods "



		#endregion

		#region " DDL Methods "

		public new static int Insert(PessoaJuridica p)
		{
			int newID = 0;

			using (TransactionScope transaction = new TransactionScope())
			{
				// Insere a Pessoa				
				p.ID = PessoaDAO<PessoaJuridica>.Insert(p);

				using (DAHelper db = new DAHelper())
				{
					// Prepara os parâmetros da Query
					List<DbParameter> parms = new List<DbParameter>();
					parms.Add(db.GetParameter(PessoaJuridica.Fields.ID, p.ID));
					parms.Add(db.GetParameter(PessoaJuridica.Fields.CNPJ, p.CNPJ));

					// Executa a query no banco de dados
					db.InsertSql(PessoaJuridica.Fields.TABELA, parms.ToArray());
					newID = p.ID;
				}

				transaction.Complete();
			}

			return newID;
		}

		public new static bool Update(PessoaJuridica p)
		{
			bool success = false;

			using (TransactionScope transaction = new TransactionScope())
			{
				using (DAHelper db = new DAHelper())
				{
					// Prepara os parâmetros da Query
					List<DbParameter> parms = new List<DbParameter>();
					parms.Add(db.GetParameter(PessoaJuridica.Fields.CNPJ, p.CNPJ));

					// Define a cláusula where do Update
					string sWhere = string.Format("{0} = {1}", PessoaJuridica.Fields.ID, p.ID);

					// Executa a query no banco de dados e retorna se foi atualizado com sucesso
					success = db.UpdateSql(PessoaJuridica.Fields.TABELA, parms.ToArray(), sWhere);
				}

				// Atualiza a Pessoa
				if (success)
					success = PessoaDAO<PessoaJuridica>.Update(p);

				if (success)
					transaction.Complete();
			}

			return success;
		}

		public new static bool Delete(PessoaJuridica p)
		{
			bool success = false;

			using (TransactionScope transaction = new TransactionScope())
			{
				using (DAHelper db = new DAHelper())
				{
					// Define a cláusula where do Delete
					string sWhere = string.Format("{0} = {1}", PessoaJuridica.Fields.ID, p.ID);

					// Executa a query no Conta de dados e retorna se o registro foi excluido com sucesso
					success = db.DeleteSql(PessoaJuridica.Fields.TABELA, sWhere);
				}

				// Exclui a Pessoa
				if (success)
					success = PessoaDAO<PessoaJuridica>.Delete(p);

				if (success)
					transaction.Complete();
			}

			return success;
		}

		#endregion

		#endregion
	}
}
